<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>this测试</title>
</head>
<body>
  <script>
    /* 相关测试题 */

    // 题1
    
    /*  
    var a = 10
    function foo () {
      console.log(this.a)
    }
    foo() 
    */


    // 题2
    
    /* 
    "use strict"   // 在严格模式下, 函数中指向window的this都为undefined
    var a = 10 // var定义的全局变量会成为window的属性
    function foo () { // 全局函数是window的方法
      console.log('this1', this)
      console.log(window.a)
      console.log(this.a) // 输出？
    }
    console.log(window.foo)
    console.log('this2', this)  // ?
    foo()  */

    /* const obj = {
      a: 'abc',
      b: funnction (){}
    }  */
    // 属性值是函数的属性就是方法  / 方法是一类特别的属性, 特别在属性值是函数
   

    // 题3
    
    // let/const的全局变量不会添加为window的属性

    /* 
    let a = 10
    const b = 20

    function foo () {
      console.log(this.a)
      console.log(this.b)
    }
    foo();
    console.log(window.a)  */
   

    // 题4
    
    /* 
    var a = 1
    function foo () {
      var a = 2
      var inner = () => { 
        console.log(a, this.a)  // 
      }
      inner()
    }
    foo()  */
   

    // 题5
    
    /*  
    function foo () {
      console.log(this.a)
    }
    var obj = { a: 1, foo: foo }
    var a = 2
    obj.foo() 
    */

    // 题6
    
    /* 
    function foo () {
      console.log(this.a)
    };
    var obj = { a: 1, foo }
    var a = 2
    var foo2 = obj.foo
    var obj2 = { a: 3, foo2: obj.foo }

    obj.foo()  // 
    foo2()  // 
    obj2.foo2()  //  */
   


    // 题7
    
    /* 
    function foo () {
      console.log(this.a)
      return function () {
        console.log(this.a)
      }
    }
    var obj = { a: 1 }
    var a = 2

    foo() // 
    foo.call(obj) // 
    foo().call(obj) //  */
   


    // 题8
    /* 
    function foo () {
      console.log(this.a)
      return function () {
        console.log(this.a)
      }
    }
    var obj = { a: 1 }
    var a = 2

    foo() // 
    foo.bind(obj) // 
    foo().bind(obj) //   
    */
   

    // 题9
    
    /* 
    var obj = {
      name: 'obj',
      foo1: () => {
        console.log(this.name)
      },
      foo2: function () {
        console.log(this.name)
        // return function () {
        return () => {
          console.log(this.name)
        }
      }
    }
    var name = 'window'
    obj.foo1() // 
    obj.foo2()() //   
    */

    // 题 10
    /* 
    function Foo() {
      getName = function() { console.log(1) }
      return this
    }

    Foo.getName = function() { console.log(2) }
    Foo.prototype.getName = function() { console.log(3) }

    var getName = function() { console.log(4) }
    function getName () { console.log(5)  }

    Foo.getName() //    静态方法: 函数对象本身的方法
    getName() // 
    Foo().getName() // 
    getName()  // 
    new Foo.getName() // 
    new Foo().getName() //  */
</script>
</body>
</html>